package edu.yngsxy.communityservice.core.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.List;

@Data // 自动生成 Getter、Setter、toString 等方法
@ConfigurationProperties(prefix = "wkstudy.cors")
@Configuration
public class CorsConfig  {

    // 默认允许的域名（开发环境）
    private String allowedOriginPatterns = "http://localhost:3000";

    // 默认允许的请求方法
    private String allowedMethods = "GET,POST,PUT,DELETE,OPTIONS";

    // 默认允许的请求头
    private String allowedHeaders = "Origin,Content-Type,Accept,Authorization";

    // 默认允许携带 Cookie
    private boolean allowCredentials = true;

    // 默认预检请求缓存时间（1小时）
    private long maxAge = 3600;
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        // 允许前端域名访问（开发环境为 localhost:3000）生产环境必须明确指定允许的前端域名（禁止使用 "*"）
        config.setAllowedOrigins(List.of(allowedOriginPatterns.split(",")));
        // 允许跨域请求的方法（GET、POST 等）按需添加，避免开放不必要的方法）
        // 2. 添加多个请求方法（Spring 6.x 支持 addAllowedMethods 复数方法）
        config.setAllowedMethods(List.of(allowedMethods.split(","))); // 这里一定存在该方法
        // 允许跨域请求的头信息（包含自定义头，如 Token 相关的 Authorization）
        config.setAllowedHeaders(List.of(allowedHeaders.split(",")));
        // 允许携带 cookie（如需登录状态）（如登录态，需前后端配合开启）
        config.setAllowCredentials(allowCredentials);
        // 对所有路径生效 允许所有接口跨域（也可指定具体路径，如 "/api/**"）
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }
}
